# include "TDAServidorInseguro.h"

# include <malloc.h>
# include <string.h>
# include <time.h>

/*void crearServidor(TDAServidorInseguro* servidor) {
    ls_Crear(&servidor->inbox,sizeof(TDACorreo));
    ls_Crear(&servidor->enviados,sizeof(TDA_Log));
    ls_Crear(&servidor->recibidos,sizeof(TDA_Log));
}*/

void crearServidor(TDAServidorInseguro* servidor) {
    servidor->inbox = (TListaSimple*) malloc (sizeof(TListaSimple));
    servidor->enviados = (TListaSimple*) malloc (sizeof(TListaSimple));
    servidor->recibidos = (TListaSimple*) malloc (sizeof(TListaSimple));

    ls_Crear(servidor->inbox,sizeof(TDACorreo));
    ls_Crear(servidor->enviados,sizeof(TDA_Log));
    ls_Crear(servidor->recibidos,sizeof(TDA_Log));
}

void destruirServidor(TDAServidorInseguro* servidor) {
    ls_Vaciar(&servidor->inbox);
    ls_Vaciar(&servidor->enviados);
    ls_Vaciar(&servidor->recibidos);
}

void cargarLog(TDACorreo correo, TDA_Log* log){
    getRemitente(correo,log->usuario);
    log->fecha_y_hora = getFechaHoraEnviado(correo);
    getAsunto(correo,log->asunto);
}

int agregarCorreo(TDAServidorInseguro* servidor, TDACorreo correo) {

    ls_Insertar(&servidor->inbox,LS_SIGUIENTE,&correo);
    TDA_Log log;
    cargarLog(correo,&log);
    ls_Insertar(&servidor->enviados,LS_SIGUIENTE,&log);
	return 0;
}

int obtenerProximoCorreo(TDAServidorInseguro servidor, char* destinatario, TDACorreo* correo) {
    /*
    char* destinatarios = (char*) malloc (sizeof(char)*(MAX_ADDR_SIZE+1));
    getDestinatarios(*servidor.inbox,destinatarios);
    int distinto = strcmp(destinatarios,destinatario);
    if (!distinto) {
        memcpy(correo,servidor.inbox,sizeof(TDACorreo));
        free(destinatarios);
        return 0;
    } else {
        free(destinatarios);
        return 1;
    }*/
    return 0;
}

int obtenerCorreos(TDAServidorInseguro* servidor, const char* destinatario, TCola* correos){
    TDACorreo correo;
    TDA_Log log;
    crearCorreo(&correo);
    int noExiste;
    ls_MoverCorriente(&servidor->inbox,LS_PRIMERO);
    do {
        ls_ElemCorriente( *(servidor->inbox),&correo);
        noExiste = eliminarDestinatario(&correo, destinatario);
        if (!noExiste) {/* 1 si no existe*/
            C_Agregar(correos,&correo);
            cargarLog(correo,&log);
            ls_Insertar(&servidor->recibidos,LS_SIGUIENTE,&log);
            if (getCantidadDestinatarios(correo))
                ls_ModifCorriente(&servidor->inbox,&correo);
            else ls_BorrarCorriente(&servidor->inbox);
        }
    } while (ls_MoverCorriente(&servidor->enviados,LS_SIGUIENTE));
    destruirCorreo(&correo);
    return 0;
}

int escribirLog(TDAServidorInseguro* servidor, FILE* archivo){
    char* time = (char*) malloc (sizeof(char)*27);
    TDA_Log log;
    ls_MoverCorriente(&servidor->enviados,LS_PRIMERO);
    while (ls_MoverCorriente(&servidor->enviados,LS_SIGUIENTE)){
        ls_ElemCorriente( *(servidor->enviados),&log);
        strftime(time, 27, "%a, %d %b %Y %X", localtime(&log.fecha_y_hora));
        fprintf(archivo,"%s : ",time);
        fprintf(archivo,"%s ",log.usuario);
        fprintf(archivo,"envio el mensaje %s\n",log.asunto);
    }
    ls_MoverCorriente(&servidor->recibidos,LS_PRIMERO);
    while (ls_MoverCorriente(&servidor->recibidos,LS_SIGUIENTE)){
        ls_ElemCorriente( *(servidor->recibidos),&log);
        strftime(time, 27, "%a, %d %b %Y %X", localtime(&log.fecha_y_hora));
        fprintf(archivo,"%s : ",time);
        fprintf(archivo,"%s ",log.usuario);
        fprintf(archivo,"recibio el mensaje %s\n",log.asunto);
    }
    free(time);
    return 0;
}

